题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
源代码:
ListNode.java
package pid21;
public class ListNode {
public int val;
//由于题设未给出get方法,未保证编译通过,这里将val声明为public
public ListNode next = null;
public ListNode(int x){
val = x;
}
//是否有后继结点
public boolean hasNext(){
if(this.next!=null){
return true;
}
return false;
}
}
Solution.java
package pid21;
public class Solution {
public static ListNode mergeTwoLists(ListNode l1,ListNode l2){
ListNode head = new ListNode(0);
ListNode curr = head;//传递head的引用给curr,curr并非一个实际的占用内存的变量
while( (l1!=null) && (l2!=null) ){
if(l1.val < l2.val){
curr.next = l1;
curr = curr.next;//指向以head为头的链表的下一元素
l1 = l1.next;//若l1无后继,那么l1=empty,下次while循环的条件不满足
}else{
curr.next = l2;
curr = curr.next;//指向以head为头的链表的下一元素
l2 = l2.next;
}
}
//走到这里说明l1、l2中至少有一个已经为空了,只需要将不为空的整个链在串后面
curr.next = (l1 != null)?l1:l2;
return head.next;//掐掉头结点
}
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(5);
n1.next = n2;
n2.next = n3;
// no1 = no1.next;
// System.out.println(no1.getValue());
// no1 = no1.next;
// System.out.println(no1.getValue());
// 通过上面几个语句,可见赋值实现的就是用后一个覆盖前驱结点
ListNode n4 = new ListNode(1);
ListNode n5 = new ListNode(3);
ListNode n6 = new ListNode(4);
n4.next = n5;
n5.next = n6;
ListNode no;//存储结果
no = mergeTwoLists(n1,n4);
while(no!=null){
System.out.print(no.val+"->");
no = no.next;
}
}
}
性能表现: