长大后想做什么?做回小孩!

0%

LeetCode——合并两个有序链表

NO.21 合并两个有序链表 简单

lFVQZ8.png

思路一:迭代法 这个题目也是学校老师讲述数据结构课程时说的。1. 创建一个新的头结点dummy,用prehead指针指向新创建的dummy头结点,用p指针指向l1链表的头结点,q指针指向l2链表的头结点。2. 比较p指向的节点的值和q指向的节点的值,如果p指向的节点值小,就让prehead的next指向p所指向的节点,然后prehead和p向后移动,反之就让prehead的next指向q所指向的节点,然后prehead和q向后移动。3. 直到p或者q指针有一个为null为止,最后检查p或者q是否有不为null的指针,如果有就让prehead指向非空的p或者q。返回dummy.next即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1==null)return l2;
if (l2==null)return l1;
ListNode dummy=new ListNode(0);
ListNode prehead=dummy,p=l1,q=l2;
while (p!=null&&q!=null){
if (p.val<q.val){
prehead.next=p;
prehead=prehead.next;
p=p.next;
}else {
prehead.next=q;
prehead=prehead.next;
q=q.next;
}
}
// 最后检查p或者q是否有不为null的指针
if (p!=null)prehead.next=p;
if (q!=null)prehead.next=q;
return dummy.next;
}

思路二:递归法 其实递归法不能算是第二个思路,只能说是思路一的另一种实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) {
return l2;
}
if(l2 == null) {
return l1;
}
if(l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}

本人菜鸟,有错误请告知,感激不尽!

更多题解和学习记录博客:博客github