def add_lists_reverse(list1, list2): """ add two lists in reverse order """ p = list1.head q = list2.head carry = 0 sum_list = LinkList() while p and q: curr_sum_digit = (p.data + q.data + carry) % 10 carry = (p.data + q.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) p = p.next q = q.next while q: curr_sum_digit = (q.data + carry) % 10 carry = (q.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) q = q.next while p: curr_sum_digit = (p.data + carry) % 10 carry = (p.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) p = p.next if carry == 1: sum_list.append_node(ListNode(1)) return sum_list
def add_lists_reverse(list1, list2): ''' add two lists in reverse order ''' p = list1.head q = list2.head carry = 0 sum_list = LinkList() while p and q: curr_sum_digit = (p.data + q.data + carry) % 10 carry = (p.data + q.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) p = p.next q = q.next while q: curr_sum_digit = (q.data + carry) % 10 carry = (q.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) q = q.next while p: curr_sum_digit = (p.data + carry) % 10 carry = (p.data + carry) / 10 sum_list.append_node(ListNode(curr_sum_digit)) p = p.next if carry == 1: sum_list.append_node(ListNode(1)) return sum_list
def add_two_lists(list1, list2): sum_list = LinkList() p = list1.head q = list2.head carry = 0 while p or q: first = p.data if p else 0 second = q.data if q else 0 sum = first + second + carry carry = sum / 10 sum = sum % 10 sum_list.append_node(ListNode(sum)) if p: p = p.next if q: q = q.next if carry: sum_list.append_node(ListNode(carry)) return sum_list
def merge_lists(lists): ''' merge len(lists) sorted linked lists, and return the result linked list ''' for each_list in lists: each_list.append_node(ListNode(sys.maxint)) min_heap = Heap() result_list = LinkList() curr_nodes = [each_list.head for each_list in lists] curr_datas = [node.data for node in curr_nodes] # build the heap according to curr_datas min_heap.build_heap('min', curr_datas) # min_heap.heap[0] == maxint means all the lists go to end, only then, stop the while loop while min_heap.heap[0] != sys.maxint: # extract min node curr_min = min_heap.extract_node() # append to result result_list.append_node(ListNode(curr_min)) min_index = curr_datas.index(curr_min) curr_nodes[min_index] = curr_nodes[min_index].next curr_datas[min_index] = curr_nodes[min_index].data # insert the extracted node's next's data, and re-heapify min_heap.add_node(curr_datas[min_index]) return result_list
def merge_two_lists_1(listA, listB): p = listA.head q = listB.head if not p: return listB if not q: return listA result_list = LinkList() #tail = ListNode(0) #tail.next = result_list.head while p and q: if p.data < q.data: result_list.append_node(ListNode(p.data)) p = p.next else: result_list.append_node(ListNode(q.data)) q = q.next if p: result_list.append_node(p) if q: result_list.append_node(q) return result_list