两个单链表生成相加链表
两个单链表生成相加链表
题目:两个链表生成相加链表
《程序员代码面试指南》第21题 P66 难度:士★☆☆☆
本题依旧有2种解法。不过首先说明一下,如果采用将链表转成系统中int类型的数的方法,当链表过长时,int类型会溢出。我一开始就采用了这个方法,上来直接就0/20用例通过。。
然后书上第1种解法是采用栈的结构,将2个链表分别依次push到2个栈中,然后同时从栈顶弹出,此时即从原链表的末端开始。弹出的2个数相加的同时需注意进位。最后,当2个栈都为空时,还需要再注意一下上一次有没有进位。有进位则最高位为1。
书中题解代码如下:
public Node addLists1(Node head1, Node head2) {
    Stack<Integer> s1 = new Stack<Integer>();
    Stack<Integer> s2 = new Stack<Integer>();
    while (head1 != null) {
      	s1.push(head1.value);
      	head1 = head1.next;
    }
    while (head2 != null) {
      	s2.push(head2.value);
      	head2 = head2.next;
    }
    int ca = 0;
    int n1 = 0;
    int n2 = 0;
    int n = 0;
    Node node = null;
    Node pre = null;
    while (!s1.isEmpty() || !s2.isEmpty()) {
        n1 = s1.isEmpty() ? 0 : s1.pop();
        n2 = s2.isEmpty() ? 0 : s2.pop();
        n = n1 + n2 + ca;
        pre = node;
        node = new Node(n % 10);
        node.next = pre;
        ca = n / 10;
    }
    if (ca == 1) {
        pre = node;
        node = new Node(1);
        node.next = pre;
    }
    return node;
}第2种解法和我的做法相同,就是首先将2个链表反转,然后同步遍历两个逆序后的链表,生成相加链表。
与第1种解法相同,在相加的过程中也需注意进位。同时当两个链表都遍历完成后,还要关注进位信息是否为1,为1则还要生成一个值为1的新节点。
书中代码如下:
public Node addLists2(Node head1, Node head2) {
    head1 = reverseList(head1);
    head2 = reverseList(head2);
    int ca = 0;
    int n1 = 0;
    int n2 = 0;
    int n = 0;
    Node c1 = head1;
    Node c2 = head2;
    Node node = null;
    Node pre = null;
    while (c1 != null || c2 != null) {
        n1 = c1 != null ? c1.value : 0;
        n2 = c2 != null ? c2.value : 0;
        n = n1 + n2 + ca;
        pre = node;
        node = new Node(n % 10);
        node.next = pre;
        ca = n / 10;
        c1 = c1 != null ? c1.next : null;
        c2 = c2 != null ? c2.next : null;
    }
    if (ca == 1) {
        pre = node;
        node = new Node(1);
        node.next = pre;
    }
    reverseList(head1);
    reverseList(head2);
    return node;
}
public Node reverseList(Node head) {
    Node pre = null;
    Node next = null;
    while (head != null) {
        next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
}
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号