題目:
將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
非遞歸方法(好理解)方法出處
解題思路:
- 比較兩個頭節點,保存小的頭結點到head鏈表,以此類推
- 若兩個鏈表長度不同,長鏈表剩下的結點存到head鏈表中
Coding~
//非遞歸方式
public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
//頭結點的前驅
ListNode dummy = new ListNode(0);
ListNode head = dummy;
//比較兩個頭節點,保存小的頭節點,以此類推
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
head.next = new ListNode(l1.val);
l1 = l1.next;
} else {
head.next = new ListNode(l2.val);
l2 = l2.next;
}
head = head.next;
}
//若兩個鏈表長度不同,長鏈表剩下的結點存到head鏈表中
if(l1 != null) head.next = l1;
if(l2 != null) head.next = l2;
return dummy.next;
}
注:
dummy結點:鏈表的第一個結點,因爲沒有前驅節點,所以該結點需要特殊處理,會導致額外的代碼量。如果創建一個dummy結點,將其作爲第一個結點的前驅結點,這樣鏈表中所有的結點都可以通過同樣的邏輯來處理了。
遞歸方法 借鑑
終止條件:任何一個鏈表空,則遞歸終止
解題思路:選出兩個鏈表中,頭結點val最小的結點,用它的next指向其他結點的集合
Coding~
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//任何一個鏈表空,則遞歸終止
if (l1 == null) return l2;
if (l2 == null) return l1;
//選出兩個鏈表中,頭結點val最小的結點,用它的next指向其他結點的集合
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
最後我們寫下測試方法吧~
public static void main(String[] args) {
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
mergeTwoLists mergeTwoLists = new mergeTwoLists();
ListNode nonrecursion = mergeTwoLists.mergeTwoLists2(l1, l2);
System.out.println(nonrecursion);
}