题目:合并有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null && l2 == null) return null;
if(l1 == null && l2!=null) return l2;
if(l1!=null && l2== null) return l1;
ListNode p1 = l1,p2 = l2;
ListNode tail,head;
if(p1.val < p2.val){
head = tail = p1;
p1 = p1.next;
}else{
head = tail = p2;
p2 = p2.next;
}
while(p1 !=null && p2 !=null){
if(p1.val < p2.val){
tail.next = p1;
p1 = p1.next;
}else{
tail.next = p2;
p2 = p2.next;
}
tail = tail.next;
}
if(p1 == null) tail.next = p2;
else if(p2 == null) tail.next = p1;
return head;
}
题目:两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序
的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思考:进位位处理,两个链表大小不相同处理,溢出情况处理 9+1 = 10
思路:处理进位位时候,考虑引进一个新变量
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l3 = new ListNode(0),curr;
ListNode p1 = l1,p2 = l2;curr = l3;
int carry = 0;
while(p1 != null || p2 != null) {
int x = p1 != null ? p1.val : 0;
int y = p2 != null ? p2.val:0;
int sum = carry+x+y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr= curr.next;
if(p1 != null) p1 = p1.next;
if(p2 != null) p2 = p2.next;
}
//此处出事是为了解决 链表溢出的问题
if(carry !=0) curr.next = new ListNode(carry);
return l3.next;
}