天天看點

藍橋杯基礎訓練(合并兩個有序連結清單,兩數字相加)

題目:合并有序連結清單
将兩個有序連結清單合并為一個新的有序連結清單并傳回。新連結清單是通過拼接給定的兩個連結清單的所有節點組成的。 

示例:

輸入: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;
	}