合并两个顺序的链表
链接:剑指 Offer 25. 合并两个排序的链表 - 力扣(LeetCode) (leetcode-cn.com)
本题中要注意解决两个问题:
1.要合并的两个链表l1,l2可能为空,所以要对这两个链表为空的情况进行三种类型讨论:(1).都为空 (2).1空,2不空 (3).1不空,2空
2.一开始的头节点设置要先处理,找两链表的头节点值中小的那一个
前置条件:
1 public class ListNode { 2 int val; 3 ListNode next; 4 ListNode(int x) { val = x; } 5 }
代码:
1 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 2 if (l1 == null && l2 == null) { 3 return null; 4 } 5 int min; 6 if (l1 == null) { 7 min = l2.val; 8 } 9 else if (l2 == null) { 10 min = l1.val; 11 } 12 else { 13 min = Math.min(l1.val, l2.val); 14 } 15 ListNode p = l1,q = l2; 16 ListNode head = new ListNode(min); 17 if (l1 != null && head.val == l1.val) { 18 p = p.next; 19 } 20 else { 21 q = q.next; 22 } 23 ListNode r = head; 24 while (p != null && q != null) { 25 if (p.val < q.val) { 26 r.next = p; 27 p = p.next; 28 r = r.next; 29 } 30 else { 31 r.next = q; 32 q = q.next; 33 r = r.next; 34 } 35 } 36 while (p != null) { 37 r.next = p; 38 p = p.next; 39 r = r.next; 40 } 41 while (q != null) { 42 r.next = q; 43 q = q.next; 44 r = r.next; 45 } 46 r = null; 47 return head; 48 }
可以将以上条件进行归纳化,得到简易代码:
1 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 2 ListNode newHead = new ListNode(0); 3 ListNode cur = newHead; 4 while (l1 != null && l2 != null) { 5 if (l1.val < l2.val) { 6 cur.next = l1; 7 l1 = l1.next; 8 } 9 else { 10 cur.next = l2; 11 l2 = l2.next; 12 } 13 cur = cur.next; 14 } 15 cur.next = l1 != null ? l1 : l2; 16 return newHead.next; 17 }