合并兩個排序的鏈表

給定兩個遞增的鏈表,合并成一個遞增鏈表
如給1 3 52 4 6,合并后該為1 2 3 4 5 6

非遞歸方法

public ListNode merge(ListNode list1, ListNode list2) {
    if (list1 == null) {
        return list2;
    }
    if (list2 == null) {
        return list1;
    }
    if (list2 == null && list1 == null) {
        return null;
    }

    ListNode newStart, temp, temp2;
    newStart = list1;
    while (list1 != null && list2 != null) { 
        temp = null;
        temp2 = null;
        if (list1.val <= list2.val) {
            while (list1 != null && list1.val <= list2.val) {
                // 如果list2結點的值大于list1,將list1引用向后移
                // 直至list1的值大于list2或者list1為null
                // temp保存list1前面的結點,方便后面的插入操作
                temp = list1;
                list1 = list1.next;
            }
         }
        // temp2指向list2后面的結點
        temp2 = list2.next;
        // 這種情況表示list1指向第一個結點,也就是list1的第一個結點值小于list2第一個節點值
        if (temp == null) {
            list2.next = list1;
            // newStart為新的鏈表頭結點
            newStart = list2;
        } else {
            // list2插入到list1中間
            list2.next = temp.next;
            temp.next = list2;
        }
          // 移動list2指向下一個結點
          list2 = temp2;
      }
      return newStart;
}

遞歸方法

public ListNode merge(ListNode list1, ListNode list2) {
     if (list1 == null) {
        return list2;
    }
    if (list2 == null) {
        return list1;
    }
    // 如果list1的值小于list2,將list1后面的結點和list2進行合并
    if (list1.val <= list2.val) {
        list1.next = merge(list1.next, list2);
        return list1;
    } else {
        // 否則將list2后面的結點跟list1進行合并
        list2.next = merge(list1, list2.next);
        return list2;
    }
}
   
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容