求两个单链表的和

题目

两个单链表(singly linked list),每一个节点里面一个0-9的数字, 输入就相当于两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list 长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次, 最差的情况下两遍。


实现代码:

public class AddSinglyLinkList {
	public static void main(String[] args) {
		int[] a = {1,1,1};
		int[] b = {1,1,1};
		
		int[] a2 = {1, 2, 3};
		int[] b2 = {1, 2, 8};
		
		int[] a3 = {1, 2, 3, 4, 5};
		int[] b3 = {1, 7, 6, 5, 9};
		
		Node head1 = makeLinkedList(a3);
		Node head2 = makeLinkedList(b3);
		System.out.println("****************");
		printNodeList(head1);
		printNodeList(head2);
		System.out.println("****************");
		Node r = addSinglyList(head1, head2);
		printNodeList(r);
		
	}
	
	static Node addSinglyList(Node h1, Node h2) {
		Node p,q;
		p = h1;
		q = h1.next;
		h2 = h2.next;
		while(q != null) {
			q.data = q.data + h2.data;
			//System.out.println(q.data);
			if(q.data > 9) {
				q.data = q.data%10;
				p.data ++;
				while(p.next != q){
					p = p.next;
					p.data = 0;
				} 
			}else if(q.data != 9) { 
				p = p.next;
			}
			q = q.next;
			h2 = h2.next;
		}
		return h1;
	}
	
	static void printNodeList(Node h) {
		Node n = h.next;
		while(n != null) {
			System.out.print(n.data + " ");
			n = n.next;
		}
		System.out.println();
	}
	
	static Node makeLinkedList(int[] a){
		Node head = new Node(0, null);
		Node p = head;
		for(int i: a) {
			Node temp = new Node(i, null);
			p.next = temp;
			p = temp;
		}
		return head;
	}
}


class Node{
	int data;
	Node next;
	Node(int data, Node next) {
		this.data = data;
		this.next = next;
	}
}


参考: http://hawstein.com/posts/add-singly-linked-list.html

### Python 实现两个单链表的并集运算 在 Python 中,可以通过定义一个简单的单链表数据结构来实现两个单链表的并集操作。以下是详细的说明代码示例。 #### 单链表节点类定义 为了表示单链表中的节点,可以先定义一个 `Node` 类,其中包含节点的数据 (`data`) 指向下一个节点的指针 (`next`)。 ```python class Node: def __init__(self, data=None): self.data = data self.next = None ``` #### 链表类定义 接着定义一个 `LinkedList` 类,用于管理多个节点的操作,比如插入节点、打印链表以及执行并集操作。 ```python class LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return last_node = self.head while last_node.next: last_node = last_node.next last_node.next = new_node def to_list(self): result = [] current_node = self.head while current_node: result.append(current_node.data) current_node = current_node.next return result def union(self, other_list): elements_set = set(self.to_list()) # 将当前链表转换为集合 for element in other_list.to_list(): if element not in elements_set: # 如果另一个链表中有不同元素,则加入 self.append(element) def display(self): elems = self.to_list() print(elems) ``` #### 并集操作逻辑 上述代码中实现了 `union` 方法,该方法的核心思想是利用集合去重的功能[^1]。具体来说: - 使用 `to_list()` 方法将链表转化为列表。 - 利用 Python 的集合类型去除重复项。 - 对于第二个链表中的每个元素,如果它不在第一个链表对应的集合中,则将其追加到结果链表中。 #### 示例代码 下面是一个完整的例子,展示如何创建两个单链表并计算它们的并集。 ```python if __name__ == "__main__": list_1 = LinkedList() list_2 = LinkedList() # 向链表1添加元素 for item in [1, 2, 3, 4]: list_1.append(item) # 向链表2添加元素 for item in [3, 4, 5, 6]: list_2.append(item) print("List 1:") list_1.display() print("List 2:") list_2.display() # 计算并集 list_1.union(list_2) print("Union of List 1 and List 2:") list_1.display() ``` 运行以上代码后,输出将是: ``` List 1: [1, 2, 3, 4] List 2: [3, 4, 5, 6] Union of List 1 and List 2: [1, 2, 3, 4, 5, 6] ``` 此代码展示了如何通过集合的方式高效地完成链表的并集操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值