合并链表 leetcode21
合并链表
//20220324
写在前面:这几天在复习算法,今天写到合并链表,发现自己突然没了思路,看答案发现很巧妙,在此记录一下
问题描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解决思路:
- 递归:直接把问题分解,传送下一层,使用递归实现从最后一个结点开始合并
- 迭代:设置一个头结点,然后遍历两个链表,一个一个接上链表结点
代码实现;
- 递归
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
if(list1.val>list2.val){
list2.next = mergeTwoLists(list2.next,list1);
}else{
list1.next = mergeTwoLists(list1.next,list2);
}
return list1.val>list2.val?list2:list1;
}
}
- 迭代
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
ListNode prevHead = new ListNode(-1);
ListNode prev = prevHead;
while(list1!=null&&list2!=null){
if(list1.val>list2.val){
prev.next = list2;
list2 = list2.next;
}else{
prev.next = list1;
list1 = list1.next;
}
prev = prev.next;
}
prev.next = list1==null?list2:list1;
return prevHead.next;
}
}
希望对后来者有所帮助
以上
/抱拳