题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
本题知识点:链表
目的:两链表单调递增合并成一个单调不减的链表。
思路:充分利用已给的两链表list1,list2,。利用尾插法将list1,list2拆解组装成新的链表head(带头结点)。此处设置了一个头结点curr = new ListNode(0);是为了方便第一个结点操作(使对其和后面的结点一样,其对应的值无意义,可任意设置)。
使用头结点的好处:
- 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
- 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。 - 头结点不是链表所必需的。
代码:
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head,curr;
curr = new ListNode(0);//头结点
head = curr;//指向头结点,用于记忆合成链表的头指针
while(list1!=null && list2!=null){//都不为空
if(list1.val<list2.val){
curr.next = list1;
list1 = list1.next;
}else{
curr.next = list2;
list2 = list2.next;
}
curr = curr.next;
}
//有一个链表为空,只需让curr的指针指向剩余一个链表的表头。
if(list1!=null)
curr.next = list1;
else if(list2!=null)
curr.next = list2;
return head.next;//(结果直接用head.next.因为有头结点)
}
}
此代码为非递归。
牛客大神披萨大叔的递归版本(简洁明了,有人在评论区评价说此方法太骚了-^^-):
链接:https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337
来源:牛客网
大神代码:
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
if(list1.val <= list2.val){
list1.next = Merge(list1.next, list2);
return list1;
}else{
list2.next = Merge(list1, list2.next);
return list2;
}
}
172万+

被折叠的 条评论
为什么被折叠?



